# -*- coding: utf-8 -*-
"""
@Time    : 2024/7/29 10:30 
@Author  : ZhangShenao 
@File    : 7. 使用RecursiveJsonSplitter递归json分割器.py 
@Desc    : 使用RecursiveJsonSplitter递归json分割器

RecursiveJsonSplitter分割器会按照深度优先的方式遍历json数据,并构建较小的json块
而且尽可能保持嵌套json对象完整
但如果需要保持文档块大小在max_chunk_size和min_chunk_size之间,则会将它们拆分
在json数据中,如果值不是嵌套的json,而是一个非常大的字符,则不会对该字符串进行拆分
可以配合RecursiveCharacterTextSplitter强制性拆分字符串,以确保块大小在限制的范围内

"""
import json

import requests
from langchain_text_splitters import RecursiveJsonSplitter

# 获取并加载json
url = 'https://api.smith.langchain.com/openapi.json'
json_data = requests.get(url).json()

# 创建RecursiveJsonSplitter分割器
splitter = RecursiveJsonSplitter(
    max_chunk_size=500,  # 指定最大和最小分块大小
    min_chunk_size=50,
)

# 分割json文本
chunks = splitter.split_text(json_data)

split_len = 0
for chunk in chunks:
    print(chunk)
    split_len += len(chunk)

for chunk in chunks[:3]:
    print(chunk)

# 因为分割后需要填充完整的json结构,因此分割后的json的总长度会大于原始json长度
print(f'原始json长度: {len(json.dumps(json_data))}, 分割后json总长度: {split_len}')
